package com.zpark;

import java.util.Scanner;

/**
 * 装箱问题
 * 书P12-14
 */
public class Boxes {
    public static void main(String[] args) {
       Scanner scan= new Scanner(System.in);
        int a, b, c, d,e , f;//a-f描述的是1x1-6x6的产品数量
        System.out.println("请输入1 x 1的产品数量");
        a = scan.nextInt();
        System.out.println("请输入2 x 2的产品数量");
        b = scan.nextInt();
        System.out.println("请输入3 x 3的产品数量");
        c = scan.nextInt();
        System.out.println("请输入4 x 4的产品数量");
        d = scan.nextInt();
        System.out.println("请输入5 x 5的产品数量");
        e = scan.nextInt();
        System.out.println("请输入6 x 6的产品数量");
        f = scan.nextInt();
        // 根据各种产品的数量，计算最少需要几个箱子；调用计算箱子数量的方法
        int result = calc(a, b, c, d, e,f);
    }

    /**
     * 计算箱子数量的方法
     * @param a
     * @param b
     * @param c
     * @param d
     * @param e
     * @param f
     * @return
     */
    private static int calc(int a, int b, int c, int d, int e, int f){
        // n代表需要的最少的箱子数
        // x代表大的产品装箱后，剩余1 x 1的空间
        // y代表2 x 2的空间
        int n, x, y;
        // 使用一个长度为4的数组序放3 x 3的产品装箱后，所余的2 x 2的空间数量
        int[] space = {0, 5, 3, 1};
        // 开始装箱
        // 先将大于等于3 x 3的箱子装箱
        n = f + e + d + (c + 3)/4;
        //计算有多少个2 x 2的空间数
        y = 5 * d + space[c % 4];
        // 判断2 x 2的空间是否能放得下2 x 2的产品
        if (b > y)
            n += (b - y + 8) / 9;
        // 计算1 x 1的空间数
        x = 36 * n - 36 * f - 25 * e - 16 * d - 9 * c - 4 * b;
        // 判断1 x 1的空间是否能放得下1 x 1的产品
        if (a > x)
            n += (a - x + 35) / 36;
        return  n;
    }
}
